// function requset(obj) {
//   //传参对象约束
//   //data 必须是get或post 部分大小写   默认get
//   return new Promise((resolve, resject) => {
//     // console.log(obj.method);
//     if (obj.method == undefined) {
//       obj.method = 'get'
//     }
//     if (obj.method.toLowerCase() != 'get' && obj.method.toLowerCase() != 'post') {
//       throw new Error('只接收GET或POST请求')
//     }
//     //路径必传  路径必须是字符串
//     if (obj.url == undefined) {
//       throw new Error('路径是必传参数')
//     }
//     if (typeof obj.url != 'string') {
//       throw new Error('路径是必为字符串')
//     }
//     if (obj.async == undefined) {
//       //不传参默认异步
//       obj.async = true
//     }

//     //async必须是布尔值
//     if (typeof obj.async == 'Boolean') {
//       console.log(obj.async);
//       throw new Error('async必须是布尔值')
//     }
//     // 判断是否传参数 类型只能是对象或数组
//     if (obj.data != undefined) {
//       let data = ''
//       //判断是对象还是字符串,并以不同的方式赋值给data
//       if ({}.toString.call(obj.data) === '[object String]') {
//         data = obj.data
//       } else if ({}.toString.call(obj.data) === '[object Object]') {
//         let arr = []
//         for (const key in obj.data) {
//           arr.push(`${key} = ${obj.data[key]}`)
//         }
//         data = arr.join('&')
//       } else {
//         throw new Error('数据类型不正确')
//       }
//       // 判断请求方式是否是get
//       if (obj.method.toLowerCase() === 'get') {
//         obj.url += '?' + data
//       }
//     }
//     //默认json字符串
//     if (obj.dataType == undefined) {
//       obj.dataType = 'json'
//     }
//     let xhr = new XMLHttpRequest
//     xhr.open(obj.method, obj.url, obj.async)
//     //判断请求 根据请求判断要不要加请求头
//     if (obj.method == 'post' && obj.data) {
//       // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
//       xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
//       console.log(obj.data);
//       xhr.send(obj.data)
//     } else {
//       xhr.send()
//     }
//     //同步异步分支
//     let res
//     if (obj.async == true) {
//       // console.log(1);
//       xhr.onreadystatechange = () => {
//         //xhr状态码
//         if (xhr.readyState == 4) {
//           //http状态码判断

//           if (xhr.status >= 200 && xhr.status <= 300) {
//             //响应的数据
//             // console.log(obj.dataType);
//             switch (obj.dataType) {
//               case 'json':
//                 res = xhr.responseText;
//                 res = JSON.parse(res)
//                 // console.log(res);
//                 break
//               case 'text':
//                 // console.log(1);
//                 res = xhr.responseText;
//                 break
//               case 'xml':
//                 res = xhr.responseXML
//                 break
//               default:
//                 throw new Error('dataType必须是json或text或xml！')
//             }
//             resolve(res)
//           } else {
//             resject(xhr.status)
//           }
//         }
//         // console.log(xhr.readyState,xhr.status);
//       }
//     } else {
//       //同步直接响应
//       switch (obj.dataType) {
//         case 'json':
//           res = xhr.responseText;
//           res = JSON.parse(res)
//           break
//         case 'text':
//           res = xhr.responseText;
//           break
//         case 'xml':
//           res = xhr.responseXML
//           break
//         default:
//           throw new Error('dataType必须是json或text或xml！')
//       }
//       resolve(res)
//     }
//   })
// }
// 封装发送ajax的get和post请求的函数
function request(obj) {
  return new Promise((resolve, reject) => {
    if (obj.url === undefined) {
      throw new Error('请求地址不能为空！')
    }
    if (typeof obj.url != 'string') {
      throw new Error('请求地址不正确！')
    }
    if (obj.method === undefined) {
      obj.method = 'get'
    }
    // if(obj.method.toLowerCase() != 'get' && obj.method.toLowerCase() != 'post') {
    //     throw new Error('请求方式必须是get或post')
    // }
    if (obj.async === undefined) {
      obj.async = true
    }
    if (typeof obj.async != 'boolean') {
      throw new Error('async必须是布尔值！')
    }
    if (obj.data != undefined) {
      var data = ''
      if ({}.toString.call(obj.data) === '[object String]') {
        if (!obj.data.includes('=')) {
          throw new Error('字符串数据格式：键=值！')
        }
        data = obj.data
      } else if ({}.toString.call(obj.data) === '[object Object]') {
        var arr = []
        for (var key in obj.data) {
          arr.push(key + '=' + obj.data[key])
        }
        data = arr.join('&')
      }
      else if ('[object FormData]' === {}.toString.call(obj.data)) {
        data = obj.data
      }
      else {
        throw new Error('数据必须是字符串或对象！')
      }
      if (obj.method.toLowerCase() === 'get') {
        obj.url += '?' + data
      }
    }
    if (obj.dataType === undefined) {
      obj.dataType = 'json'
    }
    var xhr = new XMLHttpRequest
    xhr.open(obj.method, obj.url, obj.async)
    if (obj.headers != undefined) {
      if ({}.toString.call(obj.headers) != '[object Object]') {
        throw new Error('headers头信息必须是对象！')
      }
      for (var key in obj.headers) {
        xhr.setRequestHeader(key, obj.headers[key])
      }
    }
    if (obj.method.toLowerCase() === 'post' || obj.method.toLowerCase() === 'put' && data != undefined) {
      if ({}.toString.call(data) != '[object FormData]') {
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
      }
      xhr.send(data)
    } else {
      xhr.send()
    }
    if (obj.async === true) {
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
          if (xhr.status >= 200 && xhr.status < 300) {
            switch (obj.dataType) {
              case 'json':
                var res = xhr.responseText
                res = JSON.parse(res)
                break
              case 'text':
                var res = xhr.responseText
                break
              case 'xml':
                var res = xhr.responseXML
                break
              default:
                throw new Error('dataType必须是json或text或xml！')
            }
            resolve(res)
          } else {
            reject()
          }
        }
      }
    } else {
      switch (obj.dataType) {
        case 'json':
          var res = xhr.responseText
          res = JSON.parse(res)
          break
        case 'text':
          var res = xhr.responseText
          break
        case 'xml':
          var res = xhr.responseXML
          break
        default:
          throw new Error('dataType必须是json或text或xml！')
      }
      resolve(res)
    }
  })
}